#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
配置模型
定义系统配置相关的数据库表结构
"""

from sqlalchemy import Column, String, Text, Boolean
from .base import BaseModel, db

class Config(BaseModel):
    """
    系统配置模型
    存储系统各种配置信息
    """
    __tablename__ = 'configs'
    
    # 配置键名（唯一）
    config_key = Column(String(100), unique=True, nullable=False, comment='配置键名')
    
    # 配置值
    config_value = Column(Text, nullable=True, comment='配置值')
    
    # 配置类型：string, integer, boolean, json
    config_type = Column(String(20), nullable=False, default='string', comment='配置类型')
    
    # 配置分类：wechat, news, reply, system
    category = Column(String(50), nullable=False, comment='配置分类')
    
    # 配置描述
    description = Column(Text, nullable=True, comment='配置描述')
    
    # 是否启用
    is_enabled = Column(Boolean, default=True, nullable=False, comment='是否启用')
    
    # 是否为系统配置（系统配置不允许删除）
    is_system = Column(Boolean, default=False, nullable=False, comment='是否为系统配置')
    
    # 默认值
    default_value = Column(Text, nullable=True, comment='默认值')
    
    # 配置验证规则（JSON格式）
    validation_rules = Column(Text, nullable=True, comment='配置验证规则')
    
    def __repr__(self):
        return f'<Config(id={self.id}, key="{self.config_key}", category="{self.category}")>'
    
    def get_typed_value(self):
        """
        根据配置类型返回正确类型的值
        
        Returns:
            Any: 转换后的配置值
        """
        if self.config_value is None:
            return None
            
        if self.config_type == 'boolean':
            return self.config_value.lower() in ('true', '1', 'yes', 'on')
        elif self.config_type == 'integer':
            try:
                return int(self.config_value)
            except (ValueError, TypeError):
                return 0
        elif self.config_type == 'json':
            try:
                import json
                return json.loads(self.config_value)
            except (ValueError, TypeError):
                return {}
        else:
            return self.config_value
    
    def set_typed_value(self, value):
        """
        根据配置类型设置值
        
        Args:
            value: 要设置的值
        """
        if self.config_type == 'boolean':
            self.config_value = str(bool(value)).lower()
        elif self.config_type == 'integer':
            self.config_value = str(int(value))
        elif self.config_type == 'json':
            import json
            self.config_value = json.dumps(value, ensure_ascii=False)
        else:
            self.config_value = str(value) if value is not None else None